package com.sprouting.ops.service;


import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sprouting.ops.dao.OpsDeployDao;
import com.sprouting.ops.dao.OpsDeployLinkDao;
import com.sprouting.ops.dao.OpsEnvDao;
import com.sprouting.ops.dao.OpsProductDao;
import com.sprouting.ops.model.OpsDeploy;
import com.sprouting.ops.model.OpsDeployLink;
import com.sprouting.ops.model.OpsEnv;
import com.sprouting.ops.model.qo.OpsEnvQo;
import com.sprouting.ops.model.vo.OpsEnvVo;
import com.sprouting.ops.model.vo.OpsProductVo;
import com.sprouting.ops.utils.EntityTool;
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * (OpsEnv)(ops_env) 表服务实现类
 *
 * @author ：lx（长沙麓谷）
 * @date 创建时间：2025-06-23 10:51:08
 */
@Service
@Slf4j
public class OpsEnvService extends ServiceImpl<OpsEnvDao, OpsEnv> {

    @Resource
    private OpsEnvDao opsEnvDao;
    @Resource
    private OpsProductDao opsProductDao;
    @Resource
    private OpsDeployLinkDao opsDeployLinkDao;
    @Resource
    private OpsDeployDao opsDeployDao;

    /**
     * 分页查询
     * @param page 分页参数
     * @param query 查询参数
     * @return
     */
    public Page<OpsEnvVo> getListPage(Page page, OpsEnvQo query){
        Page<OpsEnvVo> listPage = opsEnvDao.getListPage(page, query);
        List<OpsEnvVo> records = listPage.getRecords();
        if (CollUtil.isEmpty(records)){
            return listPage;
        }

        // 填充产品信息
        List<String> productIdList = records.stream().map(OpsEnvVo::getProductId).collect(Collectors.toList());
        List<OpsProductVo> productVoList = opsProductDao.getByIdList(productIdList);
        Map<String, OpsProductVo> map = EntityTool.toMap(productVoList, OpsProductVo::getId);

        for (OpsEnvVo env : records) {
            env.setProductVo(map.get(env.getProductId()));
        }

        return listPage;
    }

    /**
     * 查询可复用的环境
     * 过滤条件，
     *      1、已经被使用的环境和部署id关联的不再次查询出来
     *      2、只有当前场所有这个产品有这个环境才查询出来
     *      3、这个产品只有有这个组件依赖才查出来
     *      4、这个产品依赖产品的组件也查询出来，但不再次查询下级依赖
     * @param siteId 场所id
     * @param currentDeployId 当前部署Id
     * @return
     */
    public List<OpsEnv> getReuse(String siteId, String currentDeployId) {
        return opsEnvDao.getReuse(siteId, currentDeployId);
    }

    /**
     * 删除环境
     * @param id 环境id
     */
    @Transactional(rollbackFor = Exception.class)
    public void delOpsEnv(String id) {
        opsEnvDao.deleteById(id);

        // 根据环境id查询出是否有多个
        List<OpsDeployLink> deployLinkList = opsDeployLinkDao.getByEnvId(id);
        if (CollUtil.isEmpty(deployLinkList)){
            return;
        }

        // 删除关联部署信息,思路，查询出只有1条的才去删除,多条不删部署信息
        opsDeployDao.delByEnv(id);

        // 删除绑定的组件
        LambdaUpdateWrapper<OpsDeployLink> wrapperApp = new LambdaUpdateWrapper<>();
        wrapperApp.in(OpsDeployLink::getEnvId, id);
        opsDeployLinkDao.delete(wrapperApp);
    }
}
